package cn.vehicle.biz.eventListener;

import cn.vehicle.biz.event.VehicleChangeEvent;
import cn.vehicle.constants.Constants;
import cn.vehicle.domains.dto.BaseResponse;
import cn.vehicle.domains.entity.CommonVehicleEntity;
import cn.vehicle.domains.entity.TransportVehicleEntity;
import cn.vehicle.enums.GovUploadStatus;
import cn.vehicle.enums.VehicleTypeEnum;
import cn.vehicle.exception.VehicleAccessException;
import cn.vehicle.service.CommonVehicleService;
import cn.vehicle.service.TransportVehicleService;
import cn.vehicle.service.remote.TjRemoteService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 车辆变更上报政府平台事件监听器
 * <p>
 * 监听 {@link VehicleChangeEvent} 事件，在车辆信息变更或补偿任务触发时执行。
 * 主要职责是调用天津监管平台接口上报车辆注册信息，并更新上报状态。
 * </p>
 *
 * <p>核心逻辑：</p>
 * <ul>
 *   <li>根据事件中的车辆 ID 查询普通车辆与运输车辆信息；</li>
 *   <li>判断车辆类型是否为运输车辆；</li>
 *   <li>调用 {@link TjRemoteService#putRegisterVehicleInfo(CommonVehicleEntity, TransportVehicleEntity)} 上报车辆数据；</li>
 *   <li>根据接口返回结果更新上报状态。</li>
 * </ul>
 */
@Component
@Slf4j
public class VehicleChangeUploadGovListener implements ApplicationListener<VehicleChangeEvent> {

    @Resource
    private TransportVehicleService transportVehicleService;

    @Resource
    private CommonVehicleService commonVehicleService;

    @Resource
    private TjRemoteService tjRemoteService;


    /**
     * 事件监听回调方法
     * <p>
     * 当 {@link VehicleChangeEvent} 被发布时自动触发，
     * 执行车辆数据上报逻辑并更新政府上报状态。
     * </p>
     *
     * @param event 车辆变更事件对象，包含待上报车辆的 ID
     */
    @Override
    public void onApplicationEvent(VehicleChangeEvent event) {


        // 从事件对象中获取车辆 ID
        Long id = event.getId();

        // 查询普通车辆信息
        CommonVehicleEntity commonVehicleEntity = commonVehicleService.getCommonVehicleById(id);
        // 若普通车辆信息不存在，则抛出异常
        if (commonVehicleEntity == null) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("车辆不存在");
        }

        // 仅处理类型为“运输车辆”的数据，其他类型车辆不进行上报
        if (!commonVehicleEntity.getVehicleType().equals(VehicleTypeEnum.TRANSPORT.name())) {
            return;
        }

        // 根据普通车辆的关联 ID 查询运输车辆信息
        TransportVehicleEntity transportVehicleEntity = transportVehicleService.getTransportVehicleById(commonVehicleEntity.getAssociationId());

        if (transportVehicleEntity == null) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("车辆不存在");
        }

        // 创建更新对象，用于记录政府上报状态
        TransportVehicleEntity updateEntity = new TransportVehicleEntity();
        updateEntity.setId(transportVehicleEntity.getId());
        try {
            // 调用天津远程服务上报车辆注册信息
            BaseResponse baseResponse = tjRemoteService.putRegisterVehicleInfo(commonVehicleEntity, transportVehicleEntity);
            // 若返回结果为成功，设置状态为 SUCCESS，否则标记为 FAIL
            if (baseResponse != null && baseResponse.getCode().equals(Constants.GOV_SUCCESS_CODE)) {
                updateEntity.setGovUploadStatus(GovUploadStatus.SUCCESS.name());
            } else {
                updateEntity.setGovUploadStatus(GovUploadStatus.FAIL.name());
            }

        // 捕获网络或加密传输异常，并记录日志
        } catch (IOException e) {
            log.error("车辆信息上班政府异常", e);
            updateEntity.setGovUploadStatus(GovUploadStatus.FAIL.name());
        }

        // 更新运输车辆的政府上报状态到数据库
        transportVehicleService.updateTransportVehicle(updateEntity);

    }


    @Override
    public boolean supportsAsyncExecution() {
        return true;
    }
}
